import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 设置支持中文
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 使用更通用的字体
plt.rcParams['axes.unicode_minus'] = False  # 正常显示负号
plt.rcParams['font.size'] = 12  # 设置字体大小

# 读取 Excel 文件
name = ''  # 文件名
file_name = f'comments_pinglun.xlsx'

# 加载数据
df = pd.read_excel(file_name)

# 打印数据以检查
print(df.head())  # 打印前几行数据
print(df.info())  # 打印数据概况

# 对粉丝等级进行分档
bins = [-1, 0, 10, 20, float('inf')]  # 定义边界，-1用于包含0
labels = ['0', '1-10', '11-20', '21及以上']  # 对应的标签
df['粉丝等级档'] = pd.cut(df['粉丝等级'], bins=bins, labels=labels, right=True)

# 可视化用户性别分布
plt.figure(figsize=(8, 6))
gender_counts = df['用户性别'].value_counts()
plt.pie(gender_counts, labels=gender_counts.index, autopct='%1.1f%%', startangle=140)
plt.title(u'用户性别分布')
plt.axis('equal')  # 使饼图为圆形
plt.show()

# 可视化粉丝等级分布
plt.figure(figsize=(8, 6))
fan_level_counts = df['粉丝等级档'].value_counts()  # 使用新的粉丝等级档

# 过滤掉评论数为0的档位
fan_level_counts = fan_level_counts[fan_level_counts > 0]

plt.pie(fan_level_counts, labels=fan_level_counts.index, autopct='%1.1f%%', startangle=140)
plt.title(u'粉丝等级分布')
plt.axis('equal')
plt.show()

# 可视化用户当前等级分布
plt.figure(figsize=(8, 6))
current_level_counts = df['用户当前等级'].value_counts()
plt.pie(current_level_counts, labels=current_level_counts.index, autopct='%1.1f%%', startangle=140)
plt.title(u'用户当前等级分布')
plt.axis('equal')
plt.show()

# 可视化点赞数量最多的五个评论
plt.figure(figsize=(10, 6))
top_likes = df.nlargest(5, '点赞数量')
bar_plot = sns.barplot(x='点赞数量', y='用户昵称', data=top_likes, palette='viridis', hue='用户昵称', legend=False)

# 在条形图上显示点赞数量
for index, row in enumerate(top_likes.itertuples()):
    bar_plot.text(row.点赞数量 + 0.5, index, row.点赞数量, color='black')

plt.title(u'点赞数量最多的五个评论')
plt.xlabel(u'点赞数量')
plt.ylabel(u'用户昵称')
plt.show()

# 可视化按年份分类的回复时间
df['回复时间'] = pd.to_datetime(df['回复时间'], errors='coerce')  # 确保日期格式正确
df['年份'] = df['回复时间'].dt.year

# 统计每年的评论数量
yearly_comments = df.groupby('年份').size()

# 打印 yearly_comments 以检查
print(yearly_comments)

# 只绘制有数据的年份
if not yearly_comments.empty:
    plt.figure(figsize=(10, 6))
    line_plot = sns.lineplot(x=yearly_comments.index, y=yearly_comments.values, marker='o')

    # 在每个数据点上显示评论数
    for x, y in zip(yearly_comments.index, yearly_comments.values):
        line_plot.text(x, y, str(y), color='black', ha='center', va='bottom')

    plt.title(u'按年份分类的评论数')
    plt.xlabel(u'年份')
    plt.ylabel(u'评论数')
    plt.xticks(yearly_comments.index)  # 确保年份标签显示
    plt.show()
else:
    print("没有可用的评论数据来绘制折线图。")